// plugins.js
import * as path from "path";
import vue from "@vitejs/plugin-vue";
// 自动导入 ElementPlus 组件样式
import {
  createStyleImportPlugin,
  ElementPlusResolve,
} from "vite-plugin-style-import";
// 打包分析插件
import { visualizer } from "rollup-plugin-visualizer";
// 热更新
import ViteRestart from "vite-plugin-restart";
// ui库解析器，也可以自定义，需要安装相关UI库，unplugin-vue-components/resolvers
// 提供了以下集中解析器，使用的时候，需要安装对应的UI库，这里以vant示例
// 注释的是包含的其他一些常用组件库，供参考 注意大小写，组件都是大写开始的
import Components from "unplugin-vue-components/vite";
import {
  // ElementPlusResolver,
  // AntDesignVueResolver,
  VantResolver,
  // HeadlessUiResolver,
  // ElementUiResolver
} from "unplugin-vue-components/resolvers";
// vue3等插件 hooks 自动引入
// 支持vue, vue-router, vue-i18n, @vueuse/head, @vueuse/core等自动引入
import AutoImport from "unplugin-auto-import/vite";
// 用于生成 svg 雪碧图，方便在项目中使用 .svg 文件
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
// 一个针对 index.html，提供压缩和基于 ejs 模板功能的 vite 插件
// 通过搭配 .env 文件，可以在开发或构建项目时，对 index.html 注入动态数据，例如替换网站标题
import { createHtmlPlugin } from "vite-plugin-html";
// 使用 gzip 或者 brotli 来压缩资源
import viteCompression from "vite-plugin-compression";
// setup语法糖name增强，使vue3语法糖支持name属性
// vue3语法糖默认是没有name属性的，在我们使用keep-alive的时候需要用到name
import vueSetupExtend from "vite-plugin-vue-setup-extend";
// electron 
import electron from 'vite-plugin-electron'
import electronRenderer from 'vite-plugin-electron-renderer'

export default function createVitePlugins(env, mode) {

  return [
    vue(),
    createStyleImportPlugin({
      resolves: [ElementPlusResolve()],
      libs: [
        {
          libraryName: "element-plus",
          esModule: true,
          resolveStyle: (name) => {
            return `element-plus/lib/theme-chalk/${name}.css`;
          },
          ensureStyleFile: true,
        },
      ],
    }),
    visualizer(),
    ViteRestart({
      restart: ["my.config.[jt]s"],
    }),
    Components({
      dirs: ["src/components"], // 目标文件夹
      extensions: ["vue", "jsx"], // 文件类型
      dts: "src/components.d.ts", // 输出文件，里面都是一些import的组件键值对
      // ui库解析器，也可以自定义，需要安装相关UI库
      resolvers: [
        VantResolver(),
        // ElementPlusResolver(),
        // AntDesignVueResolver(),
        // HeadlessUiResolver(),
        // ElementUiResolver()
      ],
    }),
    AutoImport({
      imports: ["vue", "vue-router", "vuex", "@vueuse/head"],
      // 可以选择auto-import.d.ts生成的位置，使用ts建议设置为'src/auto-import.d.ts'
      dts: "src/auto-import.d.ts",
    }),
    createSvgIconsPlugin({
      // Specify the icon folder to be cached
      iconDirs: [path.resolve(process.cwd(), "src/assets/svg")],
      // Specify symbolId format
      symbolId: "icon-[dir]-[name]",
    }),
    createHtmlPlugin({
      minify: true,
      /**
       * 在这里写entry后，你将不需要在`index.html`内添加 script 标签，原有标签需要删除
       * @default src/main.ts
       */
      entry: "/src/main.ts",
      /**
       * 需要注入 index.html ejs 模版的数据
       */
      inject: {
        data: {
          // 查找.env.test文件里面的VITE_APP_TITLE，请以VITE_标识开头
          title: env.VITE_APP_TITLE || "Vite App",
          injectScript: `<script src="/inject.js"></script>`,
        },
      },
    }),

    vueSetupExtend(),
    viteCompression({
      verbose: true, // 是否在控制台中输出压缩结果
      disable: false,
      threshold: 10240, // 如果体积大于阈值，将被压缩，单位为b，体积过小时请不要压缩，以免适得其反
      algorithm: "gzip", // 压缩算法，可选['gzip'，' brotliccompress '，'deflate '，'deflateRaw']
      ext: ".gz",
      deleteOriginFile: true, // 源文件压缩后是否删除(我为了看压缩后的效果，先选择了true)
    }),
    electron({
      entry: "src-electron/main.ts",

      onstart(options) {
        options.startup(['.', '--no-sandbox']).then(r => { })
      },
      vite: {
        build: {
          sourcemap: true,
          outDir: 'dist-electron',
        },
      },
    }),
    electronRenderer(),
  ];
}
